package firstStage.part9;

/**
 * @ClassName: [StringDemo]
 * @Description: String类
 * @Author: [黄劲松]
 * @CreateDate: [2021-02-07]
 * @Version: [v1.0]
 */
/*
String类代表字符串。 Java程序中的所有字符串文字（例如"abc" ）都被实现为此类的实例。
        也就是说，Java 程序中所有的双引号字符串，都是String类的对象
字符串的特点：
字符串不变; 它们的值在创建后不能被更改。字符串缓冲区支持可变字符串。
因为String对象是不可变的，它们可以被共享。
字符串效果上相当于字符数组(char[]),但是底层原理是字节数组( byte[])
*/

public class StringDemo {
    /*String构造方法
    方法名                          说明
    public String()                 创建一个空白字符串对象， 不含有任何内容
    public String(char[] chs)       根据字符数组的内容，来创建字符事对象
    public String(byte[] bys)       根据字节数组的内容，来创建字符串对象
    String s= "abc" ;               直接赋值的方式创建字符串对象，内容就是abc
    */
    //推荐使用直接赋值得到字符串对象
    /*
    String对象的特点
    1)通过new创建的字符串对象，每一次new都会申请一 个内存空间，虽然内容相同，但是地址值不同
        char[] chs = {'a', 'b', 'e'};
        String s1 = new String(chs) ;
        String s2 = new String(chs) ;
    上面的代码中,JVM会首先创建一个字符数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2 参考的字符申内容是相同的
    2)以" "方式给出的字符申，只要字符序列相同(顺序和大小写),无论在程序代码中出现几次，
    JVM都只会建立-个String对象，并在字符串池中维护
    String s3 - "abc";
    String 54 = "abc";
    在上面的代码中，针对第一行代码， JVM会建立-个String对象放在字符串池中,并给s3参考;
    第二行则让s4直接参考字符申池中的String对象，也就是说它们本质上是同一个对象
    */
    public static void main(String[] args) {
        //public String() 创建一个空白字符串对象， 不含有任何内容
        String s1 = new String();
        System.out.println("s1:" + s1);
        //public String(char[] chs) 根据字符数组的内容，来创建字符事对象
        char[] chs = {'a', 'b', 'c'};
        String s2 = new String(chs);
        System.out.println("s2:" + s2);
        //public String(byte[] bys) 根据字节数组的内容，来创建字符串对象
        char[] bys = {97, 98, 99};
        String s3 = new String(bys);
        System.out.println("s3:" + s3);
        //String s= "abc" ; 直接赋值的方式创建字符串对象，内容就是abc
        String s4 = "abc";
        System.out.println("s4:" + s4);


    }
}
